home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Diamond Collection / The Diamond Collection (Software Vault)(Digital Impact).ISO / cdr25 / wordy.zip / SEARCH.C < prev    next >
C/C++ Source or Header  |  1995-04-29  |  3KB  |  144 lines

  1. #include "srch.h"
  2.  
  3. #define ARGCOUNT 2
  4. #define BAD_ARGS 2
  5. #define BUZZ 60
  6. #define DELAY1 500
  7. #define FILE_ERROR 10
  8.  
  9. void buzz()
  10. {
  11.       sound( BUZZ );
  12.       delay( DELAY1 );
  13.       nosound();
  14.       
  15.       return;
  16. }
  17.  
  18. Rflag b_search( char *search_word, FILE *fp, long left, long right )
  19. {
  20.    int result;
  21.    long middle;
  22.    char discard [MAX_WLEN + 1],
  23.         working [MAX_WLEN + 1],
  24.         target [MAX_WLEN];
  25.     Rflag bflag = FAIL;
  26.     
  27.       strcpy( working, search_word );
  28.       strcat( working, "\n" );   //Because fgets() reads CR's
  29.  
  30.         while( right - left > MAX_SPAN )
  31.             {
  32.             middle = ( left + right ) / 2;
  33.             fseek( fp, middle, SEEK_SET );
  34.             fgets( discard, MAX_WLEN + 1, fp ); //Throw away partial(?) string.
  35.             fgets( target, MAX_WLEN, fp );
  36.  
  37.             result = strcmp( working, target );
  38.  
  39.          if( !result )
  40.             { bflag = SUCCESS; break; }
  41.  
  42.          if( result < 0 )
  43.             right = middle;
  44.          
  45.          else
  46.             if( result > 0 )
  47.                left = middle;
  48.          
  49.             else
  50.                {
  51.                puts( "Error in strcmp() in BINARY SEARCH !" );
  52.                     exit( COMPARISON_ERROR ); //Error in strcmp() !
  53.                     }
  54.             }
  55.          
  56.       if( !bflag )
  57.          bflag = l_search( search_word, fp );
  58.  
  59.       return( bflag );
  60.  
  61. }
  62.  
  63.  
  64. Rflag l_search( char *search_word, FILE *fp )
  65. {                                          
  66.     long backstep;
  67.     int test,
  68.          i;
  69.     char target [MAX_WLEN],
  70.           work [MAX_WLEN + 1],
  71.           CR_str [] = "\n";
  72.     Rflag flag = FAIL;
  73.  
  74.  
  75.         if( ( backstep = ftell( fp ) ) > 2 * MAX_SPAN )
  76.             backstep = -1L * ( 2 * MAX_SPAN );     //Else backstep to file begin.
  77.         else
  78.             backstep = -1L * backstep;
  79.  
  80.         fseek( fp, backstep, SEEK_CUR );
  81.  
  82.         strcpy( work, search_word );  //Make working copy.
  83.         strcat( work, CR_str );       //Because fgets() reads CR's
  84.  
  85.         for( i = 0; i <= MAXTESTS; i++ )
  86.             {
  87.             if( !( fgets( target, MAX_WLEN, fp ) ) ) break; //EOF!
  88.             
  89.  
  90.             test = strcmp( work, target );
  91.             if( test < 0 && i > 0 )
  92.                 break;   //Passed possible match
  93.             if( !test )
  94.                 { flag = SUCCESS; break; }
  95.             }
  96.  
  97.         return ( flag );
  98. }
  99.  
  100. Rflag lookup( char *tstword )
  101. {
  102.     FILE *fptr;
  103.     long file_end; //Byte count of eof [length of file]
  104.    const long file_begin = 0L;   
  105.    Rflag rflag;
  106.  
  107.         disable();  //Turn off timer, so TSR doesn't mess up disk io.
  108.  
  109.       if( NULL == ( fptr = fopen( Wordfile, "r" ) ) )
  110.          exit( FILE_ERROR );
  111.  
  112.         file_end = filelength( fileno( fptr ) );
  113.  
  114.         rflag =  b_search( tstword, fptr, file_begin, file_end );
  115.                      //  ^^^^Preserves filepos in call!
  116.  
  117.         fclose( fptr );
  118.  
  119.         enable(); //Turn on timer again.
  120.  
  121.       return( rflag );
  122.  
  123. }
  124.  
  125. void main( int argc, char **argv )
  126. {
  127.  
  128.  
  129.       if( argc != ARGCOUNT )
  130.           {
  131.           puts( "\nFormat: search word" );
  132.           exit( BAD_ARGS );
  133.           }
  134.  
  135.       if( lookup( argv[1] ) )
  136.          printf( "\7\7\7%s found!", argv[1] );
  137.       else
  138.          {
  139.          buzz();
  140.          printf( "%s NOT found.", argv[1] );
  141.          }
  142.  
  143. }
  144.